package main

import (
	"fmt"
)

// 在练习 7.13 中我们定义了一个 map() 函数来使用 int 切片 (map_function.go)。
// 通过空接口和类型断言，现在我们可以写一个可以应用于许多类型的泛型的 map() 函数，为 int 和 string 构建一个把 int 值加倍和将字符串值与其自身连接（译者注：即 "abc" 变成 "abcabc" ）的 map() 函数 mapFunc()。
// 提示：为了可读性可以定义一个 interface{} 的别名，比如：type obj interface{}。

type obj interface{}

func mapFunc(o []obj, f func(obj) obj) []obj {
	res := make([]obj, len(o))
	for i, item := range o {
		res[i] = f(item)
	}
	return res
}

func main() {
	mf := func(d obj) obj {
		switch d.(type) {
		case int:
			return d.(int) * 2
		case string:
			return d.(string) + " - " + d.(string)
		}
		return d
	}

	d := []obj{1, "ruby", 6, "Go", 7, 9}
	newD := mapFunc(d, mf)
	fmt.Println(newD)
}
